package co.gov.medellin.ssti.sub.paoyer.common.exception;

/**
 * Representa informacion detallada de un posible error 'configurable' que puede
 * ocurrir en una aplicacion.
 * 
 * Aqui se hace alucion a un error 'configurable' queriendo decir con esto que
 * es un error que se espera de cierta manera en la aplicacion y cuya
 * informacion, tal como modulo, descripcion y detalles, es almacenada en unas
 * clases especificas para su posterior consulta.
 * 
 * @version 0.9
 */
public class ExceptionVO implements java.io.Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -8486211287760660476L;

	/**
	 * Codigo de la excepcion.
	 */
	private int id;

	/**
	 * Codigo del modulo al cual pertenece la excepcion. Se utiliza para los
	 * logs.
	 */
	private int module;

	/**
	 * Texto corto explicativo respecto a la excepcion.
	 */
	private String message;

	/**
	 * Informacion detallada respecto a la excepcion; incluye sugerencias.
	 */
	private String detail;

	/**
	 * Constructor de la excepcion que inicializa los atributos basicos.
	 * 
	 * @param id
	 *            Codigo de la excepcion.
	 * @param module
	 *            Codigo del modulo al cual pertenece la excepcion.
	 * @param message
	 *            Texto corto explicativo respecto a la excepcion
	 */
	public ExceptionVO(int id, int module, String message) {

		this(id, module, message, null);
	}

	/**
	 * Constructor de la excepcion que inicializa los atributos basicos.
	 * 
	 * @param id
	 *            Codigo de la excepcion.
	 * @param message
	 *            Texto corto explicativo respecto a la excepcion.
	 * @param detail
	 *            Informacion detallada respecto a la excepcion; incluye
	 *            sugerencias.
	 */
	public ExceptionVO(int id, String message, String detail) {
		this(id, 0, message, detail);
	}

	/**
	 * Constructor de la excepcion que inicializa los atributos basicos.
	 * 
	 * @param id
	 *            Codigo de la excepcion.
	 * @param module
	 *            Codigo del modulo al cual pertenece la excepcion.
	 * @param message
	 *            Texto corto explicativo respecto a la excepcion.
	 * @param detail
	 *            Informacion detallada respecto a la excepcion; incluye
	 *            sugerencias.
	 */
	public ExceptionVO(int id, int module, String message, String detail) {

		this.id = id;
		this.module = module;
		this.message = message;
		this.detail = detail;
	}

	/**
	 * Devuelve informaci�n detallada de una excepci�n, como el m�dulo al
	 * que pertenece, una descripci�n y un detalle.
	 * 
	 * @return String Una descripci�n detallada de un error.
	 * 
	 */
	public String toString() {
		String tokenInitialString = "_[[";
		String tokenFinalString = "]]";

		return tokenInitialString + this.module + "_" + this.id
				+ tokenFinalString + " " + this.message + "\n" + this.detail;
	}

	/**
	 * Obtiene la informaci�n del ID asoicado a este error.
	 * 
	 * @return Codigo de la excepcion
	 */
	public int getId() {
		return this.id;
	}

	/**
	 * Obtiene el codigo del modulo al cual pertenece la excepcion.
	 * 
	 * @return Codigo del modulo al cual pertenece la excepcion.
	 */
	public int getModule() {
		return module;
	}

	/**
	 * Obtiene un texto corto explicativo respecto a la excepcion
	 * 
	 * @return Texto corto explicativo respecto a la excepcion.
	 */
	public String getMessage() {
		return message;
	}

	/**
	 * Obtiene informacion detallada respecto a la excepcion; incluye
	 * sugerencias.
	 * 
	 * @return Informacion detallada respecto a la excepcion; incluye
	 *         sugerencias.
	 */
	public String getDetail() {
		return detail;
	}

	/**
	 * Remplaza los caracteres comodines '?' de la cadena de message por los
	 * valores del arreglo parametros[]
	 * 
	 * @param parametros
	 *            String[] Valores de los parametros
	 */
	protected void setParametersMessage(String[] parametros) {

		StringBuffer buffer = new StringBuffer(message);
		int i = -1;
		// Se utiliza la Cadena y no el StringBuffer para el indexOf()
		// porque en la version 1.3 del JDK el StringBuffer no tiene este metodo
		for (int p = 0; (p < parametros.length && (i = message.indexOf("?",
				i + 1)) != -1); p++) {
			buffer.insert(i + 1, parametros[p]);
			message = buffer.toString();
		}
		message = message.replace('?', ' ');
	}// -- setParametersMessage()

}
